{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "name": "fer2013.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "machine_shape": "hm",
      "include_colab_link": true
    },
    "kernelspec": {
      "display_name": "Environment (conda_tensorflow_p36)",
      "language": "python",
      "name": "conda_tensorflow_p36"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.5"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/amilkh/cs230-fer/blob/transfer-learning/Final-ResNet50.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "gwdg7Sv3XBaP",
        "outputId": "20cf0c2d-8ed1-408a-9899-9f457b68b45a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 577
        }
      },
      "source": [
        "%tensorflow_version 1.x\n",
        "!pip install keras-vggface\n",
        "!pip install scikit-image\n",
        "!pip install pydot"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Collecting keras-vggface\n",
            "  Downloading https://files.pythonhosted.org/packages/2f/7d/5f0319ebdc09ac1a2272364fa9583f5067b6f8aff93fbbf8835d81cbaad7/keras_vggface-0.6-py3-none-any.whl\n",
            "Requirement already satisfied: numpy>=1.9.1 in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (1.18.1)\n",
            "Requirement already satisfied: keras in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (2.2.5)\n",
            "Requirement already satisfied: pillow in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (7.0.0)\n",
            "Requirement already satisfied: h5py in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (2.8.0)\n",
            "Requirement already satisfied: scipy>=0.14 in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (1.4.1)\n",
            "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (3.13)\n",
            "Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.6/dist-packages (from keras-vggface) (1.12.0)\n",
            "Requirement already satisfied: keras-applications>=1.0.8 in /usr/local/lib/python3.6/dist-packages (from keras->keras-vggface) (1.0.8)\n",
            "Requirement already satisfied: keras-preprocessing>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from keras->keras-vggface) (1.1.0)\n",
            "Installing collected packages: keras-vggface\n",
            "Successfully installed keras-vggface-0.6\n",
            "Requirement already satisfied: scikit-image in /usr/local/lib/python3.6/dist-packages (0.16.2)\n",
            "Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (3.2.0)\n",
            "Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (2.4)\n",
            "Requirement already satisfied: scipy>=0.19.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (1.4.1)\n",
            "Requirement already satisfied: pillow>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (7.0.0)\n",
            "Requirement already satisfied: PyWavelets>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (1.1.1)\n",
            "Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.6/dist-packages (from scikit-image) (2.4.1)\n",
            "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image) (0.10.0)\n",
            "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image) (2.4.6)\n",
            "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image) (1.1.0)\n",
            "Requirement already satisfied: numpy>=1.11 in /usr/local/lib/python3.6/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image) (1.18.1)\n",
            "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image) (2.8.1)\n",
            "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx>=2.0->scikit-image) (4.4.2)\n",
            "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from cycler>=0.10->matplotlib!=3.0.0,>=2.0.0->scikit-image) (1.12.0)\n",
            "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from kiwisolver>=1.0.1->matplotlib!=3.0.0,>=2.0.0->scikit-image) (45.2.0)\n",
            "Requirement already satisfied: pydot in /usr/local/lib/python3.6/dist-packages (1.3.0)\n",
            "Requirement already satisfied: pyparsing>=2.1.4 in /usr/local/lib/python3.6/dist-packages (from pydot) (2.4.6)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "2nz38mJZXN_P",
        "outputId": "bc8c996d-150d-4748-c8d8-6395aecdf088",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        }
      },
      "source": [
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "\n",
        "import tensorflow as tf\n",
        "from tensorflow.keras.layers import *\n",
        "from tensorflow.python.lib.io import file_io\n",
        "\n",
        "%matplotlib inline\n",
        "\n",
        "import keras\n",
        "from keras import backend as K\n",
        "from keras.callbacks import ModelCheckpoint, EarlyStopping\n",
        "from keras.models import load_model\n",
        "from keras.preprocessing.image import ImageDataGenerator\n",
        "from keras_vggface.vggface import VGGFace\n",
        "from keras.utils import plot_model\n",
        "from sklearn.metrics import *\n",
        "from keras.engine import Model\n",
        "from keras.layers import Input, Flatten, Dense, Activation, Conv2D, MaxPool2D, BatchNormalization, Dropout, MaxPooling2D\n",
        "import skimage\n",
        "from skimage.transform import rescale, resize\n",
        "\n",
        "import pydot"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Using TensorFlow backend.\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "1fZczU8lGkX-",
        "colab_type": "code",
        "outputId": "b725b0f0-7f5d-4632-dba8-10deccf6211c",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 127
        }
      },
      "source": [
        "from google.colab import drive\n",
        "drive.mount('/content/drive')"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n",
            "\n",
            "Enter your authorization code:\n",
            "··········\n",
            "Mounted at /content/drive\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "nUcd6yIGduUW",
        "outputId": "ce90e871-1fe9-4451-deaa-83f1e80ca4e6",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 53
        }
      },
      "source": [
        "print(tf.__version__)\n",
        "print(keras.__version__)"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "1.15.0\n",
            "2.2.5\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "v60q28mDHnN9",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "EPOCHS = 50\n",
        "BS = 128\n",
        "DROPOUT_RATE = 0.5\n",
        "FROZEN_LAYER_NUM = 170\n",
        "\n",
        "ADAM_LEARNING_RATE = 0.001\n",
        "SGD_LEARNING_RATE = 0.01\n",
        "SGD_DECAY = 0.0001\n",
        "\n",
        "Resize_pixelsize = 197"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "itKZtFV0F7b1",
        "colab_type": "code",
        "outputId": "13abf174-0e47-4256-b488-be0d5c04248e",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 667
        }
      },
      "source": [
        "vgg_notop = VGGFace(model='resnet50', include_top=False, input_shape=(Resize_pixelsize, Resize_pixelsize, 3), pooling='avg')\n",
        "last_layer = vgg_notop.get_layer('avg_pool').output\n",
        "x = Flatten(name='flatten')(last_layer)\n",
        "x = Dropout(DROPOUT_RATE)(x)\n",
        "x = Dense(4096, activation='relu', name='fc6')(x)\n",
        "x = Dropout(DROPOUT_RATE)(x)\n",
        "x = Dense(1024, activation='relu', name='fc7')(x)\n",
        "x = Dropout(DROPOUT_RATE)(x)\n",
        "# l=0\n",
        "# for layer in vgg_notop.layers:\n",
        "#     print(layer,\"[\"+str(l)+\"]\")\n",
        "#     l=l+1\n",
        "    \n",
        "batch_norm_indices = [2, 6, 9, 13, 14, 18, 21, 24, 28, 31, 34, 38, 41, 45, 46, 53, 56, 60, 63, 66, 70, 73, 76, 80, 83, 87, 88, 92, 95, 98, 102, 105, 108, 112, 115, 118, 122, 125, 128, 132, 135, 138, 142, 145, 149, 150, 154, 157, 160, 164, 167, 170]\n",
        "for i in range(FROZEN_LAYER_NUM):\n",
        "    if i not in batch_norm_indices:\n",
        "        vgg_notop.layers[i].trainable = False\n",
        "# print('vgg layer 2 is trainable: ' + str(vgg_notop.layers[2].trainable))\n",
        "# print('vgg layer 3 is trainable: ' + str(vgg_notop.layers[3].trainable))\n",
        "\n",
        "out = Dense(7, activation='softmax', name='classifier')(x)\n",
        "\n",
        "model = Model(vgg_notop.input, out)\n",
        "\n",
        "\n",
        "optim = keras.optimizers.Adam(lr=ADAM_LEARNING_RATE, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)\n",
        "#optim = keras.optimizers.Adam(lr=0.0005, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0)\n",
        "sgd = keras.optimizers.SGD(lr=SGD_LEARNING_RATE, momentum=0.9, decay=SGD_DECAY, nesterov=True)\n",
        "rlrop = keras.callbacks.ReduceLROnPlateau(monitor='val_acc',mode='max',factor=0.5, patience=10, min_lr=0.00001, verbose=1)\n",
        "\n",
        "model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])\n",
        "# plot_model(model, to_file='model2.png', show_shapes=True)"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:66: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:541: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4432: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:190: The name tf.get_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:197: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:203: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:207: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:216: The name tf.is_variable_initialized is deprecated. Please use tf.compat.v1.is_variable_initialized instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:223: The name tf.variables_initializer is deprecated. Please use tf.compat.v1.variables_initializer instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:2041: The name tf.nn.fused_batch_norm is deprecated. Please use tf.compat.v1.nn.fused_batch_norm instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:148: The name tf.placeholder_with_default is deprecated. Please use tf.compat.v1.placeholder_with_default instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4267: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:4271: The name tf.nn.avg_pool is deprecated. Please use tf.nn.avg_pool2d instead.\n",
            "\n",
            "Downloading data from https://github.com/rcmalli/keras-vggface/releases/download/v2.0/rcmalli_vggface_tf_notop_resnet50.h5\n",
            "94699520/94694792 [==============================] - 1s 0us/step\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3733: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/optimizers.py:793: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3576: The name tf.log is deprecated. Please use tf.math.log instead.\n",
            "\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "v0mXUNZB-yI5",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "! rm -rf train; mkdir train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/emotion.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/facesdb.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/fer2013/train.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/googlesearch.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/googleset.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/jaffe.zip' -d train\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/umea.zip' -d train"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "TUuN9SLX_Qvl",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "! rm -rf dev; mkdir dev\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/fer2013/test-public.zip' -d dev\n",
        "! rm -rf test; mkdir test\n",
        "! unzip -q '/content/drive/My Drive/cs230 project/dataset/fer2013/test-private.zip' -d test"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "560jefnZ_Cyq",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
        "\n",
        "def get_datagen(dataset, aug=False):\n",
        "    if aug:\n",
        "        datagen = ImageDataGenerator(\n",
        "                            rescale=1./255,\n",
        "                            featurewise_center=False,\n",
        "                            featurewise_std_normalization=False,\n",
        "                            rotation_range=10,\n",
        "                            width_shift_range=0.1,\n",
        "                            height_shift_range=0.1,\n",
        "                            zoom_range=0.1,\n",
        "                            horizontal_flip=True)\n",
        "    else:\n",
        "        datagen = ImageDataGenerator(rescale=1./255)\n",
        "\n",
        "    return datagen.flow_from_directory(\n",
        "            dataset,\n",
        "            target_size=(197, 197),\n",
        "            color_mode='rgb',\n",
        "            shuffle = True,\n",
        "            class_mode='categorical',\n",
        "            batch_size=BS)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "4aQAGQP5_Gpl",
        "colab_type": "code",
        "outputId": "db5b5ad2-5910-4bea-8a51-ca2bb6282371",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 127
        }
      },
      "source": [
        "train_generator  = get_datagen('/content/train', True)\n",
        "dev_generator    = get_datagen('/content/dev')\n",
        "test_generator  = get_datagen('/content/test')\n"
      ],
      "execution_count": 10,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/keras_preprocessing/image/utils.py:173: UserWarning: Using \".tiff\" files with multiple bands will cause distortion. Please verify your output.\n",
            "  warnings.warn('Using \".tiff\" files with multiple bands '\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "Found 30452 images belonging to 7 classes.\n",
            "Found 3589 images belonging to 7 classes.\n",
            "Found 3589 images belonging to 7 classes.\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab_type": "code",
        "id": "pLISdlaStbUn",
        "outputId": "aef860ad-1ad9-4a51-dcd2-5f01b01eae25",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        }
      },
      "source": [
        "history = model.fit_generator(\n",
        "    generator = train_generator,\n",
        "    validation_data=dev_generator, \n",
        "    steps_per_epoch=28709// BS,\n",
        "    validation_steps=3509 // BS,\n",
        "    shuffle=True,\n",
        "    epochs=100,\n",
        "    callbacks=[rlrop],\n",
        "    use_multiprocessing=True,\n",
        ") "
      ],
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "WARNING:tensorflow:From /tensorflow-1.15.0/python3.6/tensorflow_core/python/ops/math_grad.py:1424: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
            "Instructions for updating:\n",
            "Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1033: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.\n",
            "\n",
            "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1020: The name tf.assign is deprecated. Please use tf.compat.v1.assign instead.\n",
            "\n",
            "Epoch 1/100\n",
            "224/224 [==============================] - 264s 1s/step - loss: 3.0307 - acc: 0.3056 - val_loss: 1.3475 - val_acc: 0.5093\n",
            "Epoch 2/100\n",
            "224/224 [==============================] - 255s 1s/step - loss: 1.4237 - acc: 0.4558 - val_loss: 1.1940 - val_acc: 0.5665\n",
            "Epoch 3/100\n",
            "224/224 [==============================] - 252s 1s/step - loss: 1.3051 - acc: 0.5081 - val_loss: 1.1122 - val_acc: 0.5869\n",
            "Epoch 4/100\n",
            "224/224 [==============================] - 253s 1s/step - loss: 1.2342 - acc: 0.5373 - val_loss: 1.0782 - val_acc: 0.5929\n",
            "Epoch 5/100\n",
            "224/224 [==============================] - 253s 1s/step - loss: 1.1904 - acc: 0.5538 - val_loss: 1.0559 - val_acc: 0.6055\n",
            "Epoch 6/100\n",
            "224/224 [==============================] - 262s 1s/step - loss: 1.1502 - acc: 0.5674 - val_loss: 1.0280 - val_acc: 0.6175\n",
            "Epoch 7/100\n",
            "224/224 [==============================] - 268s 1s/step - loss: 1.1231 - acc: 0.5788 - val_loss: 1.0401 - val_acc: 0.6199\n",
            "Epoch 8/100\n",
            "224/224 [==============================] - 268s 1s/step - loss: 1.0945 - acc: 0.5887 - val_loss: 1.0129 - val_acc: 0.6322\n",
            "Epoch 9/100\n",
            "224/224 [==============================] - 265s 1s/step - loss: 1.0746 - acc: 0.5977 - val_loss: 1.0020 - val_acc: 0.6322\n",
            "Epoch 10/100\n",
            "224/224 [==============================] - 262s 1s/step - loss: 1.0497 - acc: 0.6030 - val_loss: 0.9763 - val_acc: 0.6415\n",
            "Epoch 11/100\n",
            "224/224 [==============================] - 257s 1s/step - loss: 1.0359 - acc: 0.6079 - val_loss: 0.9914 - val_acc: 0.6340\n",
            "Epoch 12/100\n",
            "224/224 [==============================] - 251s 1s/step - loss: 1.0236 - acc: 0.6164 - val_loss: 0.9723 - val_acc: 0.6385\n",
            "Epoch 13/100\n",
            "224/224 [==============================] - 248s 1s/step - loss: 0.9991 - acc: 0.6242 - val_loss: 0.9721 - val_acc: 0.6568\n",
            "Epoch 14/100\n",
            "224/224 [==============================] - 249s 1s/step - loss: 0.9878 - acc: 0.6316 - val_loss: 0.9484 - val_acc: 0.6535\n",
            "Epoch 15/100\n",
            "224/224 [==============================] - 250s 1s/step - loss: 0.9754 - acc: 0.6318 - val_loss: 0.9550 - val_acc: 0.6502\n",
            "Epoch 16/100\n",
            "224/224 [==============================] - 252s 1s/step - loss: 0.9711 - acc: 0.6342 - val_loss: 0.9669 - val_acc: 0.6496\n",
            "Epoch 17/100\n",
            "224/224 [==============================] - 256s 1s/step - loss: 0.9630 - acc: 0.6384 - val_loss: 0.9278 - val_acc: 0.6652\n",
            "Epoch 18/100\n",
            "224/224 [==============================] - 259s 1s/step - loss: 0.9425 - acc: 0.6484 - val_loss: 0.9613 - val_acc: 0.6481\n",
            "Epoch 19/100\n",
            "224/224 [==============================] - 265s 1s/step - loss: 0.9315 - acc: 0.6487 - val_loss: 0.9265 - val_acc: 0.6628\n",
            "Epoch 20/100\n",
            "224/224 [==============================] - 263s 1s/step - loss: 0.9185 - acc: 0.6554 - val_loss: 0.9403 - val_acc: 0.6589\n",
            "Epoch 21/100\n",
            "224/224 [==============================] - 262s 1s/step - loss: 0.9116 - acc: 0.6546 - val_loss: 0.9400 - val_acc: 0.6664\n",
            "Epoch 22/100\n",
            "224/224 [==============================] - 259s 1s/step - loss: 0.8979 - acc: 0.6619 - val_loss: 0.9314 - val_acc: 0.6646\n",
            "Epoch 23/100\n",
            "224/224 [==============================] - 261s 1s/step - loss: 0.8796 - acc: 0.6688 - val_loss: 0.9309 - val_acc: 0.6604\n",
            "Epoch 24/100\n",
            "224/224 [==============================] - 262s 1s/step - loss: 0.8941 - acc: 0.6641 - val_loss: 0.9297 - val_acc: 0.6697\n",
            "Epoch 25/100\n",
            "224/224 [==============================] - 264s 1s/step - loss: 0.8785 - acc: 0.6710 - val_loss: 0.9161 - val_acc: 0.6628\n",
            "Epoch 26/100\n",
            "224/224 [==============================] - 265s 1s/step - loss: 0.8641 - acc: 0.6742 - val_loss: 0.9165 - val_acc: 0.6712\n",
            "Epoch 27/100\n",
            "224/224 [==============================] - 263s 1s/step - loss: 0.8610 - acc: 0.6754 - val_loss: 0.9058 - val_acc: 0.6847\n",
            "Epoch 28/100\n",
            "224/224 [==============================] - 262s 1s/step - loss: 0.8579 - acc: 0.6742 - val_loss: 0.9052 - val_acc: 0.6709\n",
            "Epoch 29/100\n",
            "224/224 [==============================] - 264s 1s/step - loss: 0.8476 - acc: 0.6798 - val_loss: 0.9128 - val_acc: 0.6715\n",
            "Epoch 30/100\n",
            "224/224 [==============================] - 263s 1s/step - loss: 0.8371 - acc: 0.6855 - val_loss: 0.9003 - val_acc: 0.6806\n",
            "Epoch 31/100\n",
            "224/224 [==============================] - 258s 1s/step - loss: 0.8240 - acc: 0.6875 - val_loss: 0.9016 - val_acc: 0.6718\n",
            "Epoch 32/100\n",
            "224/224 [==============================] - 251s 1s/step - loss: 0.8181 - acc: 0.6900 - val_loss: 0.8988 - val_acc: 0.6802\n",
            "Epoch 33/100\n",
            "224/224 [==============================] - 248s 1s/step - loss: 0.8095 - acc: 0.6943 - val_loss: 0.8845 - val_acc: 0.6844\n",
            "Epoch 34/100\n",
            "224/224 [==============================] - 248s 1s/step - loss: 0.8074 - acc: 0.6950 - val_loss: 0.8790 - val_acc: 0.6883\n",
            "Epoch 35/100\n",
            "224/224 [==============================] - 247s 1s/step - loss: 0.7967 - acc: 0.7007 - val_loss: 0.9014 - val_acc: 0.6874\n",
            "Epoch 36/100\n",
            "224/224 [==============================] - 257s 1s/step - loss: 0.7953 - acc: 0.6977 - val_loss: 0.8860 - val_acc: 0.6898\n",
            "Epoch 37/100\n",
            "224/224 [==============================] - 254s 1s/step - loss: 0.7827 - acc: 0.7031 - val_loss: 0.8788 - val_acc: 0.6853\n",
            "Epoch 38/100\n",
            "224/224 [==============================] - 252s 1s/step - loss: 0.7796 - acc: 0.7078 - val_loss: 0.8690 - val_acc: 0.6877\n",
            "Epoch 39/100\n",
            "224/224 [==============================] - 262s 1s/step - loss: 0.7675 - acc: 0.7125 - val_loss: 0.8982 - val_acc: 0.6913\n",
            "Epoch 40/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.7690 - acc: 0.7085 - val_loss: 0.8843 - val_acc: 0.6883\n",
            "Epoch 41/100\n",
            "224/224 [==============================] - 268s 1s/step - loss: 0.7595 - acc: 0.7159 - val_loss: 0.8569 - val_acc: 0.6943\n",
            "Epoch 42/100\n",
            "224/224 [==============================] - 270s 1s/step - loss: 0.7591 - acc: 0.7132 - val_loss: 0.8915 - val_acc: 0.6901\n",
            "Epoch 43/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.7511 - acc: 0.7168 - val_loss: 0.8575 - val_acc: 0.6931\n",
            "Epoch 44/100\n",
            "224/224 [==============================] - 271s 1s/step - loss: 0.7498 - acc: 0.7142 - val_loss: 0.8680 - val_acc: 0.6907\n",
            "Epoch 45/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.7331 - acc: 0.7236 - val_loss: 0.8696 - val_acc: 0.6955\n",
            "Epoch 46/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.7287 - acc: 0.7226 - val_loss: 0.8712 - val_acc: 0.7006\n",
            "Epoch 47/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.7248 - acc: 0.7242 - val_loss: 0.8549 - val_acc: 0.6979\n",
            "Epoch 48/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.7198 - acc: 0.7287 - val_loss: 0.8748 - val_acc: 0.6916\n",
            "Epoch 49/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.7099 - acc: 0.7303 - val_loss: 0.8584 - val_acc: 0.6970\n",
            "Epoch 50/100\n",
            "224/224 [==============================] - 275s 1s/step - loss: 0.7097 - acc: 0.7316 - val_loss: 0.8558 - val_acc: 0.7021\n",
            "Epoch 51/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.7040 - acc: 0.7356 - val_loss: 0.8778 - val_acc: 0.6904\n",
            "Epoch 52/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.6876 - acc: 0.7393 - val_loss: 0.8625 - val_acc: 0.7000\n",
            "Epoch 53/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.6995 - acc: 0.7350 - val_loss: 0.8466 - val_acc: 0.7078\n",
            "Epoch 54/100\n",
            "224/224 [==============================] - 276s 1s/step - loss: 0.6813 - acc: 0.7393 - val_loss: 0.8658 - val_acc: 0.6991\n",
            "Epoch 55/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.6802 - acc: 0.7424 - val_loss: 0.8380 - val_acc: 0.7099\n",
            "Epoch 56/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.6724 - acc: 0.7447 - val_loss: 0.8540 - val_acc: 0.7132\n",
            "Epoch 57/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.6712 - acc: 0.7457 - val_loss: 0.8629 - val_acc: 0.6961\n",
            "Epoch 58/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.6647 - acc: 0.7498 - val_loss: 0.8555 - val_acc: 0.7048\n",
            "Epoch 59/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.6669 - acc: 0.7504 - val_loss: 0.8533 - val_acc: 0.7049\n",
            "Epoch 60/100\n",
            "224/224 [==============================] - 275s 1s/step - loss: 0.6603 - acc: 0.7474 - val_loss: 0.8493 - val_acc: 0.7054\n",
            "Epoch 61/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.6549 - acc: 0.7538 - val_loss: 0.8557 - val_acc: 0.7081\n",
            "Epoch 62/100\n",
            "224/224 [==============================] - 275s 1s/step - loss: 0.6442 - acc: 0.7571 - val_loss: 0.8458 - val_acc: 0.7081\n",
            "Epoch 63/100\n",
            "224/224 [==============================] - 277s 1s/step - loss: 0.6429 - acc: 0.7554 - val_loss: 0.8509 - val_acc: 0.7129\n",
            "Epoch 64/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.6356 - acc: 0.7601 - val_loss: 0.8548 - val_acc: 0.7003\n",
            "Epoch 65/100\n",
            "224/224 [==============================] - 276s 1s/step - loss: 0.6273 - acc: 0.7616 - val_loss: 0.8476 - val_acc: 0.7078\n",
            "Epoch 66/100\n",
            "224/224 [==============================] - 275s 1s/step - loss: 0.6199 - acc: 0.7670 - val_loss: 0.8439 - val_acc: 0.7177\n",
            "Epoch 67/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.6195 - acc: 0.7618 - val_loss: 0.8620 - val_acc: 0.7084\n",
            "Epoch 68/100\n",
            "224/224 [==============================] - 279s 1s/step - loss: 0.6112 - acc: 0.7695 - val_loss: 0.8562 - val_acc: 0.7081\n",
            "Epoch 69/100\n",
            "224/224 [==============================] - 278s 1s/step - loss: 0.6077 - acc: 0.7686 - val_loss: 0.8385 - val_acc: 0.7162\n",
            "Epoch 70/100\n",
            "224/224 [==============================] - 275s 1s/step - loss: 0.6049 - acc: 0.7696 - val_loss: 0.8461 - val_acc: 0.7102\n",
            "Epoch 71/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.5964 - acc: 0.7723 - val_loss: 0.8294 - val_acc: 0.7189\n",
            "Epoch 72/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.6086 - acc: 0.7696 - val_loss: 0.8550 - val_acc: 0.7084\n",
            "Epoch 73/100\n",
            "224/224 [==============================] - 271s 1s/step - loss: 0.5938 - acc: 0.7765 - val_loss: 0.8424 - val_acc: 0.7112\n",
            "Epoch 74/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.5877 - acc: 0.7788 - val_loss: 0.8511 - val_acc: 0.7081\n",
            "Epoch 75/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.5766 - acc: 0.7823 - val_loss: 0.8324 - val_acc: 0.7162\n",
            "Epoch 76/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5801 - acc: 0.7815 - val_loss: 0.8459 - val_acc: 0.7084\n",
            "Epoch 77/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.5754 - acc: 0.7845 - val_loss: 0.8471 - val_acc: 0.7168\n",
            "Epoch 78/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5746 - acc: 0.7846 - val_loss: 0.8631 - val_acc: 0.7057\n",
            "Epoch 79/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.5646 - acc: 0.7886 - val_loss: 0.8459 - val_acc: 0.7198\n",
            "Epoch 80/100\n",
            "224/224 [==============================] - 276s 1s/step - loss: 0.5736 - acc: 0.7825 - val_loss: 0.8329 - val_acc: 0.7129\n",
            "Epoch 81/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.5647 - acc: 0.7886 - val_loss: 0.8497 - val_acc: 0.7045\n",
            "Epoch 82/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5554 - acc: 0.7896 - val_loss: 0.8637 - val_acc: 0.7081\n",
            "Epoch 83/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5547 - acc: 0.7900 - val_loss: 0.8403 - val_acc: 0.7168\n",
            "Epoch 84/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.5368 - acc: 0.7972 - val_loss: 0.8346 - val_acc: 0.7105\n",
            "Epoch 85/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5431 - acc: 0.7951 - val_loss: 0.8689 - val_acc: 0.7081\n",
            "Epoch 86/100\n",
            "224/224 [==============================] - 263s 1s/step - loss: 0.5426 - acc: 0.7951 - val_loss: 0.8410 - val_acc: 0.7099\n",
            "Epoch 87/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5363 - acc: 0.7980 - val_loss: 0.8499 - val_acc: 0.7051\n",
            "Epoch 88/100\n",
            "224/224 [==============================] - 271s 1s/step - loss: 0.5384 - acc: 0.7973 - val_loss: 0.8440 - val_acc: 0.7098\n",
            "Epoch 89/100\n",
            "224/224 [==============================] - 271s 1s/step - loss: 0.5316 - acc: 0.7984 - val_loss: 0.8539 - val_acc: 0.7069\n",
            "\n",
            "Epoch 00089: ReduceLROnPlateau reducing learning rate to 0.004999999888241291.\n",
            "Epoch 90/100\n",
            "224/224 [==============================] - 270s 1s/step - loss: 0.5222 - acc: 0.8035 - val_loss: 0.8488 - val_acc: 0.7144\n",
            "Epoch 91/100\n",
            "224/224 [==============================] - 271s 1s/step - loss: 0.5190 - acc: 0.8029 - val_loss: 0.8432 - val_acc: 0.7117\n",
            "Epoch 92/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.5137 - acc: 0.8047 - val_loss: 0.8529 - val_acc: 0.7129\n",
            "Epoch 93/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.5114 - acc: 0.8106 - val_loss: 0.8369 - val_acc: 0.7126\n",
            "Epoch 94/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.5028 - acc: 0.8103 - val_loss: 0.8724 - val_acc: 0.7126\n",
            "Epoch 95/100\n",
            "224/224 [==============================] - 273s 1s/step - loss: 0.4967 - acc: 0.8140 - val_loss: 0.8617 - val_acc: 0.7033\n",
            "Epoch 96/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.5058 - acc: 0.8088 - val_loss: 0.8249 - val_acc: 0.7213\n",
            "Epoch 97/100\n",
            "224/224 [==============================] - 272s 1s/step - loss: 0.4964 - acc: 0.8122 - val_loss: 0.8640 - val_acc: 0.7048\n",
            "Epoch 98/100\n",
            "224/224 [==============================] - 271s 1s/step - loss: 0.5070 - acc: 0.8098 - val_loss: 0.8378 - val_acc: 0.7156\n",
            "Epoch 99/100\n",
            "224/224 [==============================] - 271s 1s/step - loss: 0.4948 - acc: 0.8145 - val_loss: 0.8635 - val_acc: 0.7087\n",
            "Epoch 100/100\n",
            "224/224 [==============================] - 274s 1s/step - loss: 0.4856 - acc: 0.8166 - val_loss: 0.8355 - val_acc: 0.7192\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "JSSv08SHF0bC",
        "colab_type": "code",
        "outputId": "fcbf1deb-f88a-4795-f537-c300778b8e4e",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 71
        }
      },
      "source": [
        "print('\\n# Evaluate on dev data')\n",
        "results_dev = model.evaluate_generator(dev_generator, 3509 // BS)\n",
        "print('dev loss, dev acc:', results_dev)"
      ],
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\n",
            "# Evaluate on dev data\n",
            "dev loss, dev acc: [0.8601535028881497, 0.7106481481481481]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Ev4sDYDlOsqk",
        "colab_type": "code",
        "outputId": "ce1e70b2-5c49-40e3-9305-d997ae154638",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 71
        }
      },
      "source": [
        "print('\\n# Evaluate on test data')\n",
        "results_test = model.evaluate_generator(test_generator, 3509 // BS)\n",
        "print('test loss, test acc:', results_test)"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "\n",
            "# Evaluate on test data\n",
            "test loss, test acc: [0.7965417526386402, 0.7265625]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "m9f7smhHUQus",
        "colab_type": "code",
        "outputId": "637b9233-f0e1-429f-f631-5a15a24c1c6a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 591
        }
      },
      "source": [
        "# list all data in history\n",
        "print(history.history.keys())\n",
        "# summarize history for accuracy\n",
        "plt.plot(history.history['acc'])\n",
        "plt.plot(history.history['val_acc'])\n",
        "plt.title('model accuracy')\n",
        "plt.ylabel('accuracy')\n",
        "plt.xlabel('epoch')\n",
        "plt.legend(['train', 'dev'], loc='upper left')\n",
        "plt.show()\n",
        "# summarize history for loss\n",
        "plt.plot(history.history['loss'])\n",
        "plt.plot(history.history['val_loss'])\n",
        "plt.title('model loss')\n",
        "plt.ylabel('loss')\n",
        "plt.xlabel('epoch')\n",
        "plt.legend(['train', 'dev'], loc='upper left')\n",
        "plt.show()"
      ],
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "dict_keys(['val_loss', 'val_acc', 'loss', 'acc', 'lr'])\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\nRK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        },
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n1TJNAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "F-QKHTmJQhi1",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        "epoch_str = '-EPOCHS_' + str(EPOCHS)\n",
        "test_acc = 'test_acc_%.3f' % results_test[1]\n",
        "model.save('/content/drive/My Drive/cs230 project/models/' + 'RESNET50' + epoch_str + test_acc + '.h5')"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yJceV2fuFEfQ",
        "colab_type": "code",
        "colab": {}
      },
      "source": [
        ""
      ],
      "execution_count": 0,
      "outputs": []
    }
  ]
}